package com.tedu.springmvc2.controller;

import com.tedu.springmvc2.mapper.UserMapper;
import com.tedu.springmvc2.pojo.dto.UserDTO;
import com.tedu.springmvc2.pojo.dto.UserUpdateDTO;
import com.tedu.springmvc2.pojo.entity.User;
import com.tedu.springmvc2.pojo.vo.UserVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;
/**
 * @RestController注解:
 * 使用@RestController注解,可以简化代码,不用再使用@ResponseBody注解
 *
 * */
//@Controller
@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @RequestMapping("/delete")
    //@ResponseBody
    public String delete(Integer id){
        System.out.println("用户删除操作");
        int num = userMapper.deleteById(id);
        return num>0?"删除成功":"删除失败";
    }
    /*
            Spring框架提供了一个工具类:BeanUtils,其中的一个静态方法copyProperties
            可以将一个对象中的属性值设置到另一个对象的同名属性上。实现拷贝属性值的操作
         */
        //从userDAO中将属性值设置到user同名属性上
    @RequestMapping("/reg")
    //@ResponseBody
    public String reg(UserDTO userDTO){
        System.out.println("开始处理注册");
        System.out.println(userDTO);
        User user = new User();

        BeanUtils .copyProperties(userDTO,user);
        user.setCreated(new Date());
        System.out.println(user);
        userMapper.insert(user);
        return "注册成功";
    }
    @RequestMapping("/update")
    //@ResponseBody
    public String update(UserUpdateDTO userUpdateDTO){
        User user = new User();
        System.out.println("开始处理修改");
        System.out.println(userUpdateDTO);
        BeanUtils .copyProperties(userUpdateDTO,user);
        int num = userMapper.updateById(user);
        return num > 0 ? "修改成功":"修改失败";
    }
    /**
     *
     * @ResponseBody注解
     * 如果当前方法返回的是一个对象，那么该注解会将对象序列化，然后传送给浏览器
     *
     * 对象序列化:
     * 将一个对象转换为一组可以用于"磁盘存储"或"网络传输"的一组数据的过程
     * 曾经学习过的:ObjectOutputStream就是用于将对象序列化的(有其自己一套格式)。
     *
     * @ResponseBody注解,SpringMVC框架是将对象用JSON格式进行序列化的
     *
     * JSON:JavaScript Object Notation   js对象表示法
     *
     * JavaScript:是一个运行在浏览器上的前端脚本语言，因为其语法近似于java，因此得名为:javascript
     * 本身它和java没有任何关系。
     *
     * JSON本身是用字符串格式表示一个对象。
     * 基本规则:
     *  1:表示一个对象的格式:
     *    {
     *        "属性名": "属性值",
     *        "属性名": "属性值",
     *        ...
     *    }
     *
     *  2:表示数组
     *    2.1:表示字符串类型数组:
     *    ["元素1","元素2","元素3",...]
     *
     *    2.2:表示数字类型数组:
     *    [1,2,3,4,5,...]
     *
     *    2.3:对象数组
     *    [
     *      {
     *          "name": "张三",
     *          "age": 26,
     *          "gender": "男"
     *      },
     *      {
     *          "name": "李四",
     *          "age": 18,
     *          "gender": "女"
     *      },
     *      ...
     *    ]
     */
    @RequestMapping("/findAll")
    //@ResponseBody
    public List<UserVO> findAll(){
        return userMapper.selectAll();
    }
}
